export class MathHelper {
    /**
* 随机产生一个范围的值(整数)
* @param min 最小值
* @param max 最大值
*/
    static RandomNumber(min: any, max: any): number {
        return Math.floor(
            parseInt(
                Math.random() * (max - min + 1) + min, 10)
        );
    }
    /**
    * 随机几率(整数)
    * @param 几率 （0-1）
    */
    static RandomRate(rate: number): boolean {
        var result = Math.random();
        return rate > result;
    }
    /**
    * 随机产生一个范围的值 
    * @param min 最小值
    * @param max 最大值
    */
    static RandomRange(min: number, max: number): number {
        return Math.random() * (max - min) + min;
    }
    /**
    * 区间映射 
    * @param max1 区间1最大值
    * @param min1 区间1最小值
    * @param max2 区间2最大值
    * @param min2 区间2最小值
    *@param value 区间1映射值
    */
    static Mapping(max1: number, min1: number, max2: number, min2: number, value: number): number {
        return ((max2 - min2) / (max1 - min1)) * (value - min1) + min2;
    }
    /**
    * 秒转换成时分秒
    *@param seconds 秒数
    */
    static FormatSeconds(seconds) {
        let result = parseInt(seconds);
        let h = Math.floor(result / 3600) < 10 ? Math.floor(result / 3600) : Math.floor(result / 3600);
        let m = Math.floor((result / 60 % 60)) < 10 ? Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));
        let s = Math.floor((result % 60)) < 10 ? Math.floor((result % 60)) : Math.floor((result % 60));
        let time = { "hour": h, "min": m, "sec": s };
        return time;
    }
    /**
    * 秒转换成时分秒格式
    *@param seconds 秒数
    */
    static FormatSecondsFormat(seconds) {
        let result = parseInt(seconds);
        let h = Math.floor(result / 3600) < 10 ? Math.floor(result / 3600) : Math.floor(result / 3600);
        let m = Math.floor((result / 60 % 60)) < 10 ? Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));
        let s = Math.floor((result % 60)) < 10 ? Math.floor((result % 60)) : Math.floor((result % 60));
        let hstr = h.toString(); let mstr = m.toString(); let sstr = s.toString();
        if (h < 10) hstr = 0 + hstr.toString(); if (m < 10) mstr = 0 + mstr.toString(); if (s < 10) sstr = 0 + sstr.toString();
        let time = { "hour": hstr, "min": mstr, "sec": sstr };
        return time;
    }
    /**
    * 随机打乱数组
    *@param arr 秒数
    */
    static Foo(arr: any[]) {
        let cloneArr = arr.concat();
        let len = cloneArr.length;
        for (let i = 0; i < len; i++) {
            let index = Math.floor(Math.random() * cloneArr.length);
            let temp = cloneArr[index];
            cloneArr[index] = cloneArr[i];
            cloneArr[i] = temp;
        }
        return cloneArr;
    }
    /**
    * 复制二维数组
    * @param array 目标数组 
    */
    public static Copy2DArray(array: any[][]): any[][] {
        let newArray: any[][] = [];
        for (let i = 0; i < array.length; i++) {
            newArray.push(array[i].concat());
        }
        return newArray;
    }

    /**
    * 抽奖，根据概率数组内的概率返回相应的索引
    *@param arr 概率数组
    */
    static Lottery(arr: Array<number>) {
        let rdNum = Math.random();
        for (let index = 0; index < arr.length; index++) {
            let preSum = 0;
            if (index == 0) {
                preSum = 0;
            }
            else {
                preSum = this.GetSum(arr, 0, index - 1);
            }
            let nextSum = this.GetSum(arr, 0, index);
            if (rdNum >= preSum && rdNum < nextSum) {
                return index;
            }
        }
        return 0;
    }
    /**
    * 获得数组对应区间综合（默认0-数组最后索引）
    *@param arr 数组
    *@param startIndex 开始索引
    *@param endIndex 结束索引
    */
    static GetSum(arr: Array<number>, startIndex = 0, endIndex = arr.length) {

        let sum = 0;
        for (let index = startIndex; index <= endIndex; index++) {
            sum += arr[index];
        }
        return sum;
    }
    /**
 * 数组扁平化
 * @param array 目标数组
 */
    static Flattening(array: any[]) {
        for (; array.some(v => Array.isArray(v));) {    // 判断 array 中是否有数组
            array = [].concat.apply([], array); // 压扁数组
        }
        return array;
    }
    /**
* 合并数组
* @param array1 目标数组1
* @param array2 目标数组2
*/
    public static CombineArrays(array1: any[], array2: any[]): any[] {
        let newArray = [...array1, ...array2];
        return newArray;
    }
    /**
* 获取随机数组成员
* @param array 目标数组
*/
    public static GetRandomInArray(array: any[]): any {
        let newArray = array[Math.floor(Math.random() * array.length)];
        return newArray;
    }
}